﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//int main() {
//	auto add = [](int x, int y)->int {return x + y; };
//	cout << add(1, 2) << endl;
//	auto print = [] {cout << "hello world" << endl; };
//    print();
//	int a = 0, b = 1;
//	auto swap = [](int& x, int& y) {
//		int temp = x;
//		x = y;
//		y = temp;
//		};
//    swap(a, b);
//    cout << a << " " << b << endl;
//	return 0;
//}
//struct Books {
//	string name;
//    int price;
//	int id;
//	Books(const string& name, int price,int id)
//		: name(name), price(price), id(id)
//	{}
//};
//struct compareLess {
//	bool operator()(const Books& a, const Books& b) {
//        return a.price < b.price;
//    }
//
//};
//struct compareGreater {
//	bool operator()(const Books& a, const Books& b) {
//		return a.price > b.price;
//	}
//};
//int main() {
//	vector<Books> books = { {"西游记",45,345},{"红楼梦",54,567},{"三国演义",42,235}};
//	sort(books.begin(), books.end(), compareGreater());
//	sort(books.begin(), books.end(), compareLess());
//
//	sort(books.begin(), books.end(), [](const Books& a, const Books& b) {
//		return a.price < b.price;
//		});
//	sort(books.begin(), books.end(), [](const Books& a, const Books& b) {
//		return a.price > b.price;
//		});
//	sort(books.begin(), books.end(), [](const Books& a, const Books& b) {
//		return a.id < b.id;
//		});
//	sort(books.begin(), books.end(), [](const Books& a, const Books& b) {
//		return a.id > b.id;
//		});
//	return 0;
//}
/*int x = 0;
auto func1 = [] {x++;};
int main() {
	int a = 0, b = 1, c = 2, d = 3;*/
	//auto func2 = [a, &b] {
	//	//a++;不可修改
	//	b++;
	//	x++;
	//	int ret = a + b + x;
	//	return ret;
	//	};
	// 隐式捕捉  隐式引⽤捕捉
    // ⽤了哪些变量就捕捉哪些变量
	/*auto func2 = [=] {int ret = a + b + c + d; return ret; };
    cout << func2() << endl;
	auto func3 = [&] {a++; b++; c++; };
	func3();	
	cout<<"a="<<a<<" b="<<b<<" c="<<c<<" d="<<d << endl;*/
	// 混合捕捉1
	//auto func4 = [&, a, b]
	//	{
	//		//a++;
	//		//b++;
	//		c++;
	//		d++;
	//		return a + b + c + d;
	//	};
	//cout<<func4()<<endl;
	//cout << a << " " << b << " " << c << " " << d << endl;
	//// 混合捕捉1
	//auto func5 = [=, &a, &b]
	//	{
	//		a++;
	//		b++;
	//		/*c++;
	//		d++;*/
	//		return a + b + c + d;
	//	};
	//cout<<func5()<<endl;
	//cout << a << " " << b << " " << c << " " << d << endl;
	/*static int m = 5;
	auto func6 = [] {return x + m; };
    cout << func6() << endl;*/
	// mutable相当于去掉const属性，可以修改了
// 但是修改了不会影响外⾯被捕捉的值，因为是⼀种拷⻉
	/*auto func7 = [=]()mutable
		{
			a++;
			b++;
			c++;
			d++;
			return a + b + c + d;
		};
	cout << func7() << endl;
	cout << a << " " << b << " " << c << " " << d << endl;
}*/
class Rate
{
public:
	Rate(double rate)
		: _rate(rate)
	{}
	double operator()(double money, int year)
	{
		return money * _rate * year;
	}
private:
	double _rate;
};
int main()
{
	double rate = 0.49;
	// lambda
	auto r2 = [rate](double money, int year) {
		return money * rate * year;
		};
	// 函数对象
	Rate r1(rate);
	r1(10000, 2);
	r2(10000, 2);
	auto func1 = [] {
		cout << "hello world" << endl;
		};
	func1();
	return 0;
}